#ifndef __ARBRE__
#define __ARBRE__

#include "ensemble.h"

enum _Operande
  {
    valeur,
    addition,
    multiplication,
    soustraction,
    division
  };
typedef enum _Operande Operande;

struct _Noeud
{
  int element;
  Ensemble *ensemble;
  Operande operande;
};
typedef struct _Noeud Noeud;

struct _Arbre
{
  Noeud *adRacine;
};
typedef struct _Arbre Arbre;

/**
 * Initialise une arbre vide
 */
void initArbreVide(Arbre *arbre);

/**
 * Initialise un arbre avec un entier
 */
void initArbreEntier(Arbre *arbre, const int i);

/**
 * Intialise une copie de l'arbre passé en argument
 */
void initArbreCopie(Arbre *arbreDest, const Arbre *arbreSource);

/**
 * Initialise un arbre à partir de l'expression passée en argument
 */
void initArbreExpression(Arbre *arbre, const char *expression);

/**
 * Detruit l'arbre passsé en argument
 */
void detruireArbre(Arbre *arbre);

/**
 * Additionne les arbres passsés en arguments dans un nouvel arbre et le retourne
 */
void additionArbres(const Arbre *arbreA, const Arbre *arbreB, Arbre *arbreR);

/**
 * Multiplie les arbres passsés en arguments dans un nouvel arbre et le retourne
 */
void multiplicationArbres(const Arbre *arbreA, const Arbre *arbreB, Arbre *arbreR);

/**
 * Divise les arbres passsés en arguments dans un nouvel arbre et le retourne
 */
void divisionArbres(const Arbre *arbreA, const Arbre *arbreB, Arbre *arbreR);

/**
 * Soustrait les arbres passsés en arguments dans un nouvel arbre et le retourne
 */
void soustractionArbres(const Arbre *arbreA, const Arbre *arbreB, Arbre *arbreR);

/**
 * Calcule et retourne la valeur de l'arbre passé en argument
 */
double valeurArbre(const Arbre *arbre);

/**
 * Affiche l'arbre passé en argument sous forme d'arbre
 */
void afficheArbre(const Arbre *arbre);

/**
 * Affiche l'arbre passé en argument sous forme d'expression
 */
void afficheArbreExpression(const Arbre *arbre);

/**
 * Déveleppe le produit de l'arbre
 */
void developpeProduitArbre(const Arbre *arbre, Arbre *arbreDev);

#endif
